package src.com.client.service;

import src.com.qqcommon.Message;
import src.com.qqcommon.MessageType;
import src.com.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
 * 完成用户登陆验证和用户注册等功能
 */
public class UserClientService {
    boolean b = false;

    private User u = new User(); // 因为可能在其他地方使用到User信息

    private Socket socket;// 因为socket在其他地方也可能使用 因此也应设为属性

    // 根据UserId和password到服务器验证用户身份
    public boolean checkUser(String userId, String pwd) {
        // 创建User对象
        u.setUserId(userId);
        u.setPassword(pwd);
        // 连接到服务端，发送u对象
        try {
            socket = new Socket(InetAddress.getByName("127.0.0.1"), 9999);
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(u); // 发送User对象到服务器

            // 读取从服务器回复的Message对象
            ObjectInputStream ois = new ObjectInputStream(socket.getInputStream());
            Message ms = (Message) ois.readObject();

            if (ms.getMesType().equals(MessageType.MESSAGE_LOGIN_SUCCEED)) { // 登陆成功

                // 创建一个和服务器端保持通信的线程
                ClientConnectServerThread clientConnectServerThread = new ClientConnectServerThread(socket);
                // 启动客户端线程
                clientConnectServerThread.start();
                // 为了后面客户端的拓展，将线程放到集合中管理
                ManageClientConnectServerThread.addClientConnectServerThread(userId, clientConnectServerThread);
                b = true;
            } else {
                // 如果登录失败 就不能启动和服务器通信的线程， 关闭socket
                socket.close();

            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return b;
    }

    // 先服务器端请求在线用户列表
    public void onlineFriendList() {
        // 发送一个Message对象 类型为MESSAGE_GET_ONLINE_FRIEND
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        message.setGetter(u.getUserId());
        // 发送给服务器
        // 应该得到当前线程的socket对应的ObjectOutputStream对象
        try {
            // 得到当前userId的socket线程
            ClientConnectServerThread clientConnectServerThread =
                    ManageClientConnectServerThread.getClientConnectServerThread(u.getUserId());
            // 得到当前线程的socket对应的ObjectOutputStream对象
            ObjectOutputStream oos = new ObjectOutputStream(clientConnectServerThread.getSocket().getOutputStream());
            oos.writeObject(message); // 向服务器发一个Message对象 请求在线用户列表
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    // 推出客户端 并给服务器发送一个退出系统的Message对象
    public void logOut() {
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);
        message.setSender(u.getUserId()); // 使服务器知道是哪个客户端线程需要退出

        try {
            // 发送message对象
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
            objectOutputStream.writeObject(message);
            System.out.println(u.getUserId() + "退出了系统");
            System.exit(0); // 结束进程
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

}
